<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>Kafka系列一之入门 | Hexo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="简介　　Kafka是linkedin用于日志处理的分布式消息队列系统。linkedin的日志数据容量大，但对可靠性要求不高。当前很多的消息队列服务提供可靠交付保证，并默认是即时消费（不适合离线）。高可靠交付对linkedin的日志不是必须的，故可通过降低可靠性来提高性能，同时通过构建分布式的集群，允许消息在系统中累积，使得kafka同时支持离线和在线日志处理。Kafka的架构如下图所示
特点　　1">
<meta property="og:type" content="article">
<meta property="og:title" content="Kafka系列一之入门">
<meta property="og:url" content="http://yoursite.com/2016/01/12/mq/4.Kafka系列之入门/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="简介　　Kafka是linkedin用于日志处理的分布式消息队列系统。linkedin的日志数据容量大，但对可靠性要求不高。当前很多的消息队列服务提供可靠交付保证，并默认是即时消费（不适合离线）。高可靠交付对linkedin的日志不是必须的，故可通过降低可靠性来提高性能，同时通过构建分布式的集群，允许消息在系统中累积，使得kafka同时支持离线和在线日志处理。Kafka的架构如下图所示
特点　　1">
<meta property="og:image" content="http://yoursite.com/images/kafka-framework.png">
<meta property="og:image" content="http://yoursite.com/images/kafka-partition.png">
<meta property="og:image" content="http://yoursite.com/images/kafka-segment.png">
<meta property="og:image" content="http://yoursite.com/images/kafka-consumer.png">
<meta property="og:image" content="http://yoursite.com/images/kafka-push-pull.png">
<meta property="og:image" content="http://yoursite.com/images/kafka-partition-replication.png">
<meta property="og:updated_time" content="2016-01-29T17:47:36.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Kafka系列一之入门">
<meta name="twitter:description" content="简介　　Kafka是linkedin用于日志处理的分布式消息队列系统。linkedin的日志数据容量大，但对可靠性要求不高。当前很多的消息队列服务提供可靠交付保证，并默认是即时消费（不适合离线）。高可靠交付对linkedin的日志不是必须的，故可通过降低可靠性来提高性能，同时通过构建分布式的集群，允许消息在系统中累积，使得kafka同时支持离线和在线日志处理。Kafka的架构如下图所示
特点　　1">
  
    <link rel="alternative" href="/atom.xml" title="Hexo" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  <link rel="stylesheet" href="/css/style.css" type="text/css">
  

</head>
<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">Hexo</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" results="0" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-mq/4.Kafka系列之入门" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2016/01/12/mq/4.Kafka系列之入门/" class="article-date">
  <time datetime="2016-01-12T07:50:00.000Z" itemprop="datePublished">2016-01-12</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/mq/">mq</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Kafka系列一之入门
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="u7B80_u4ECB"><a href="#u7B80_u4ECB" class="headerlink" title="简介"></a>简介</h2><p>　　Kafka是linkedin用于日志处理的分布式消息队列系统。linkedin的日志数据容量大，但对可靠性要求不高。当前很多的消息队列服务提供可靠交付保证，并默认是即时消费（不适合离线）。高可靠交付对linkedin的日志不是必须的，故可通过降低可靠性来提高性能，同时通过构建分布式的集群，允许消息在系统中累积，使得kafka同时支持离线和在线日志处理。Kafka的架构如下图所示<img src="/images/kafka-framework.png" alt="kafka-framework.png"></p>
<h2 id="u7279_u70B9"><a href="#u7279_u70B9" class="headerlink" title="特点"></a>特点</h2><p>　　1. 快速：单台kafka的broker实例能够支撑几千台机器每秒几百兆字节的读写，如果组成集群性能会更强进，从很多人的测试情况来看kafka的读写性能表现不输于当前流行的消息队，甚至领先很多<br>　　2. 扩展性：弹性透明的扩展，不需要停机，kafka的数据是分区的，可以分布在不同的server中，允许消费者并发的访问<br>　　3. 持久化：集群中的数据被持久化在磁盘上，以防止数据丢失<br>　　4. 分布式：kafka基于cluster-centric理念设计，有很好的容错性</p>
<h2 id="u6982_u5FF5"><a href="#u6982_u5FF5" class="headerlink" title="概念"></a>概念</h2><p>　　要熟悉kafka首先要了解一下kafka中的几个角色<br>　　1. Broker：kafka cluster便是由多个Broker组成，每个Broker代表kafka的一个实例（server）。一个集群由多个broker组成，一个broker可以容纳多个topic。<br>　　2. Producer——producer作为整个消息系统的输入部分，直接通过socket和Broker连接发布消息。<br>　　3. Consumer——consumer作为消息的消费者负责处理消息<br>　　无论是kafka集群，还是producer和consumer都依赖于zookeeper来保证系统可用性，zookeeper集群保存一些meta信息。毋庸置疑如何处理消息是一个消息系统核心的功能，比如生产者如何生产消息、消息怎么存储、消费者如何消费消息、消息的可靠性、重复性等等。</p>
<h2 id="Topic"><a href="#Topic" class="headerlink" title="Topic"></a>Topic</h2><p>　　topic是kafka抽象出来的一个概念，一个Topic可以被认为是一类消息，<strong>每个topic被分成多个partition</strong>。每个partition在存储层面是append log文件。任何发布到此partition的消息都会被直接追加到log文件的尾部，每条消息在文件中的位置称为offset（偏移量），offset为一个long型数字，它唯一标记一条消息。同一个partition中的消息是有序的，但是针对整个topic中的所有消息kafka不保证有序，这是因为每个partition只允许一个group（多个consumer构成一个group）中的一个consumer消费。
　　</p>
<h2 id="Partition"><a href="#Partition" class="headerlink" title="Partition"></a>Partition</h2><p>　　kafka中partition的概念非常的巧妙，在某种程度上消费者能够并发的消费消息就是因为partition的存在。<br>　　生产者将消息放入topic中，但是topic会被分成若干个partition（个数可配置），每个partition在物理上对应一个commit-log日志文件，每次发布消息都会以append的方式新增log，这是一个顺序写磁盘的过程性能上不会有太大的问题，同时在写日志前可以做buffer批量写磁盘。<br>　　同一个topic的不同partition会分布在不同的server上从而将访问压力分散开发，同时一个partitioin只允许同一个group中的某个消费者消费。关于哪个partition存放在哪个server上等一些meta信息全部存储在zookeeper上。<img src="/images/kafka-partition.png" alt="kafka-partition.png"></p>
<h2 id="Offset"><a href="#Offset" class="headerlink" title="Offset"></a>Offset</h2><p>　　kafka的存储文件都是按照offset.kafka来命名，用offset做名字的好处是方便查找。例如你想找位于2049的位置，只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka</p>
<h2 id="u6D88_u606F_u5B58_u50A8"><a href="#u6D88_u606F_u5B58_u50A8" class="headerlink" title="消息存储"></a>消息存储</h2><p>　　kafka集群会保留所有已经发布过的消息，保存的时间可以通过配置文件指定，比如指定两天，则两天前发布的消息不管是否被消费都将被删除。从另一个角度看kafka允许消费者重复消费两天前的消息，这一点可能和很多消息系统不同，同时由于这个特性使得kafka也适合做离线的大数据分析。</p>
<h2 id="u5B58_u50A8_u7B56_u7565"><a href="#u5B58_u50A8_u7B56_u7565" class="headerlink" title="存储策略"></a>存储策略</h2><p>　　1. kafka以topic来进行消息管理，每个topic包含多个partition，每个part对应一个逻辑log，有多个segment组成。<br>　　2. 每个segment中存储多条消息（见下图），消息id由其逻辑位置决定，即从消息id可直接定位到消息的存储位置，避免id到位置的额外映射。<br>　　3. 每个part在内存中对应一个index，记录每个segment中的第一条消息偏移。<br>　　4.  发布者发到某个topic的消息会被均匀的分布到多个partition上（随机或根据用户指定的回调函数进行分布），broker收到发布消息往对应part的最后一个segment上添加该消息，当某个segment上的消息条数达到配置值或消息发布时间超过阈值时，segment上的消息会被flush到磁盘，<strong>只有flush到磁盘上的消息才能被订阅者订阅到</strong>，segment达到一定的大小后将不会再往该segment写数据，broker会创建新的segment。<br><img src="/images/kafka-segment.png" alt="kafka-segment.png"></p>
<h2 id="kafak_u548Czookeeper"><a href="#kafak_u548Czookeeper" class="headerlink" title="kafak和zookeeper"></a>kafak和zookeeper</h2><p>　　1. Broker端使用zookeeper用来注册broker信息并保持相关的元数据（topic，partition信息等）更新，以及监测partition leader存活性<br>　　2. Producer端使用zookeeper发现broker列表，以及和Topic的每个<strong>partition leader</strong>建立socket连接并发送消息<br>　　3. Consumer端使用zookeeper用来注册consumer信息，包括consumer消费的partition列表等，同时也用来发现broker列表，保证在添加或去除broker时，各broker间仍能自动实现负载均衡。并和partition leader建立socket连接，并获取消息</p>
<h2 id="Producer"><a href="#Producer" class="headerlink" title="Producer"></a>Producer</h2><p>　　producer负责生产消息，它会和topic中所有的partition leader（不同的broker实例）保持socket，然后直接将消息发送到对应的broker上，因此消息的负载均衡完全由producer侧来负责，默认kafka提供了轮询的方式。</p>
<h2 id="Consumer"><a href="#Consumer" class="headerlink" title="Consumer"></a>Consumer</h2><p>　　针对消息系统通常都会有两种模式：一种类似Queue，就是消息队列中的消息只会由一个消费者消费（<strong>点对点模式</strong>），另一种是<strong>订阅发布模式</strong>，只要订阅该消息的消费者都会收到广播的消息。<br>　　Kafka通过<strong>consumer group</strong>的概念来支持这两种方式。一个consumer group包含若干个consumer，topic中的消息只会被订阅该topic的group中的一个consumer消费，但是一个topic可以有多个consumer group。点对点模式：所有的消费者拥有相同的group；发布订阅模式：每个consumer都属于不同的consumer group<br>　　consumer消费消息的方式是通过改变offset来实现的，offset和partition一一对应并且保存在zookeeper上，consumer会定期的更新offset的值到zookeeper上。consumer默认支持reblance，该特性很好的达到了consumer的容错和扩展功能，举例来说：<img src="/images/kafka-consumer.png" alt="kafka-consumer.png"><br>　　上面就是reblance的过程，但是它有一个明显的缺点是消费者可能负载会不均衡，同时kafka建议partition的个数不能少于consumer的个数，如果不满足会出现有的consumer永远不会消费到消息。如果reblance算法不能满足使用需求，可以使用simple level api自己定义均衡算法，这种方式更灵活，同时应用的可能也更广泛。</p>
<h2 id="Push_u548CPull"><a href="#Push_u548CPull" class="headerlink" title="Push和Pull"></a>Push和Pull</h2><p>　　生产者负责push消息，<strong>消费者采用pull的方式拉取消息</strong>。push模式很难适应消费速率不同的消费者，因为消息发送速率是由broker决定的。push模式的目标是尽可能以最快速度传递消息，但是这样很容易造成consumer来不及处理消息（在rabbitmq中消费者消费的消息就是server push过来的。），典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。而在scribe和flume系统中则完全使用的是另外一种模式，这里不做介绍。<img src="/images/kafka-push-pull.png" alt="kafka-push-pull.png"></p>
<h2 id="u526F_u672C"><a href="#u526F_u672C" class="headerlink" title="副本"></a>副本</h2><p>　　kafka通过提供partition的复制策略来提高kafka的容错性，可以配置partition的副本个数，类似zookeeper的复制机制。<br>　　kafka针对partition的复制需要选出一个leader，由该leader负责partition的读写操作，其他的副本节点只是负责数据的同步。如果leader失效，将由其他follower来接管(成为新的leader)。<br>　　如果flower数据落后leader太多，leader会把该flower剔除。由于leader的server承载了全部的请求压力，因此从集群的整体考虑，有多少个partitions就意味着有多少个leader，kafka会将leader均横的分散在每个实例上，来确保整体的性能稳定。一个kafka集群各个节点间可能互为leader和flower。<img src="/images/kafka-partition-replication.png" alt="kafka-partition-replication.png"><br>　　上图中针对partition-2、partition-4，Broker-1是Broker-2的flower，同理针对partition-1、partition-3，Broker-2是Broker-1的flower，这种设计能够最大化的降低节点宕机带来的风险，同时采用选取leader的方式能够降低代码实现的复杂度，如果没有leader则需要考虑N*N的复制路径，一方面实现起来复杂另一方面效率也不一定会好</p>
<h2 id="u6D88_u606F_u5904_u7406_u673A_u5236"><a href="#u6D88_u606F_u5904_u7406_u673A_u5236" class="headerlink" title="消息处理机制"></a>消息处理机制</h2><p>　　1) at most once：最多一次，消息只发送一次，不管是否成功处理都不会重发。考虑消费者从broker获取到消息后然后触发commit动作，该动作会将offset的值写入到zk，下一次获取消息的时候会根据此偏移量获取，如果在commit后消费者处理消息失败则消费者永远不会再处理到该消息（offset以持久到zk）。<br>　　2) at least once:：消息至少发送一次，如果消息未能成功处理，可能会重发直到成功。考虑消费者从broker获取消息后先进行处理，等处理完在commit，但是在commit之前系统崩溃，这会导致系统下次还会再一次处理该消息，因此如果对消息的重复处理有严格的要求，比如扣费，则需要慎重使用该项，可以从接口设计方面改善，比如将扣费接口设计成幂等性的操作，从而避免消息重复发送造成的重复扣费。<br>　　3) exactly once：消息只会发送一次。kafka中并没有严格的去实现(基于2阶段提交，事务)，如果一定要做到exactly once ，就需要协调offset和实际操作的输出。精典的做法是引入两阶段提交，但是如果能让offset和操作输入存在同一个地方，会更简洁和通用。这种方式可能更好，因为许多输出系统可能不支持两阶段提交。比如，consumer拿到数据后可能把数据放到HDFS，如果把最新的offset和数据本身一起写到HDFS，那就可以保证数据的输出和offset的更新要么都完成，要么都不完成，间接实现exactly once。offset的处理可以使用simple level api自定义去完成。<br>　　两阶段提交的实现比较麻烦，它需要事务的协调者和事务的所有参与者之间经过多次消息的确认才能完成一个完成的事务提交动作，中间任何一步出错，所有参与者的事务都需要回滚。</p>
<h2 id="u53C2_u8003_u5730_u5740"><a href="#u53C2_u8003_u5730_u5740" class="headerlink" title="参考地址"></a>参考地址</h2><p><a href="http://blog.chinaunix.net/uid-20196318-id-2420884.html" target="_blank" rel="external">http://blog.chinaunix.net/uid-20196318-id-2420884.html</a></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2016/01/12/mq/4.Kafka系列之入门/" data-id="cijzzpv9n008f1cfst97zwes4" class="article-share-link">Share</a>
      
      
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/kafka/">kafka</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/mq/">mq</a></li></ul>

    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2016/01/12/mq/5.Kafka系列之安装使用/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          Kafka系列二之安装使用
        
      </div>
    </a>
  
  
    <a href="/2016/01/10/docker/6.docker系列之数据卷/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">docker系列六之数据卷</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Categories</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/cache/">cache</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/database/">database</a><span class="category-list-count">13</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/docker/">docker</a><span class="category-list-count">6</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/gis/">gis</a><span class="category-list-count">4</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/git/">git</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/go/">go</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/gradle/">gradle</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/groovy/">groovy</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/hadoop/">hadoop</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/java/">java</a><span class="category-list-count">18</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/linux/">linux</a><span class="category-list-count">4</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/log/">log</a><span class="category-list-count">11</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/mongodb/">mongodb</a><span class="category-list-count">14</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/mq/">mq</a><span class="category-list-count">6</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/mybatis/">mybatis</a><span class="category-list-count">9</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/netty/">netty</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/nginx/">nginx</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/nio/">nio</a><span class="category-list-count">19</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/nodejs/">nodejs</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/redis/">redis</a><span class="category-list-count">6</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/rpc/">rpc</a><span class="category-list-count">14</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/spring/">spring</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/tomcat/">tomcat</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/zookeeper/">zookeeper</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/杂项/">杂项</a><span class="category-list-count">2</span></li></ul>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/aop/">aop</a><span class="tag-list-count">8</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/aspectj/">aspectj</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/cache/">cache</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/classloader/">classloader</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/common-loggings/">common-loggings</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/commonjs/">commonjs</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/database/">database</a><span class="tag-list-count">10</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/docker/">docker</a><span class="tag-list-count">6</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/dubbo/">dubbo</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/fastdfs/">fastdfs</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/gclib/">gclib</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/geohash/">geohash</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/gis/">gis</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/git/">git</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/go/">go</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/gradle/">gradle</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/groovy/">groovy</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/hadoop/">hadoop</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/hessisan/">hessisan</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/java/">java</a><span class="tag-list-count">48</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/javassist/">javassist</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/kafka/">kafka</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/linux/">linux</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/log/">log</a><span class="tag-list-count">11</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/log4j/">log4j</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/logback/">logback</a><span class="tag-list-count">5</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/map/">map</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/memecached/">memecached</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/mina/">mina</a><span class="tag-list-count">5</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/mongodb/">mongodb</a><span class="tag-list-count">14</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/mq/">mq</a><span class="tag-list-count">6</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/mqtt/">mqtt</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/mybatis/">mybatis</a><span class="tag-list-count">9</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/netty/">netty</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/nginx/">nginx</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/nio/">nio</a><span class="tag-list-count">5</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/nodejs/">nodejs</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/postgresql/">postgresql</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/protobuf/">protobuf</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/proxy/">proxy</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/push/">push</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/rabbitmq/">rabbitmq</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/redis/">redis</a><span class="tag-list-count">6</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/rpc/">rpc</a><span class="tag-list-count">14</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/sitemesh/">sitemesh</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/sld/">sld</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/slf4j/">slf4j</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/socket/">socket</a><span class="tag-list-count">7</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/spatialite-for-android/">spatialite for android</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/spi/">spi</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/spring/">spring</a><span class="tag-list-count">13</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/tomcat/">tomcat</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/transaction/">transaction</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/web/">web</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/xSocket/">xSocket</a><span class="tag-list-count">7</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/zbus/">zbus</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/zookeeper/">zookeeper</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/数据结构/">数据结构</a><span class="tag-list-count">2</span></li></ul>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/tags/aop/" style="font-size: 15.38px;">aop</a> <a href="/tags/aspectj/" style="font-size: 11.54px;">aspectj</a> <a href="/tags/cache/" style="font-size: 11.54px;">cache</a> <a href="/tags/classloader/" style="font-size: 10px;">classloader</a> <a href="/tags/common-loggings/" style="font-size: 10px;">common-loggings</a> <a href="/tags/commonjs/" style="font-size: 12.31px;">commonjs</a> <a href="/tags/database/" style="font-size: 16.92px;">database</a> <a href="/tags/docker/" style="font-size: 13.85px;">docker</a> <a href="/tags/dubbo/" style="font-size: 10px;">dubbo</a> <a href="/tags/fastdfs/" style="font-size: 10px;">fastdfs</a> <a href="/tags/gclib/" style="font-size: 10.77px;">gclib</a> <a href="/tags/geohash/" style="font-size: 10px;">geohash</a> <a href="/tags/gis/" style="font-size: 10px;">gis</a> <a href="/tags/git/" style="font-size: 10.77px;">git</a> <a href="/tags/go/" style="font-size: 10px;">go</a> <a href="/tags/gradle/" style="font-size: 10px;">gradle</a> <a href="/tags/groovy/" style="font-size: 10px;">groovy</a> <a href="/tags/hadoop/" style="font-size: 10px;">hadoop</a> <a href="/tags/hessisan/" style="font-size: 11.54px;">hessisan</a> <a href="/tags/java/" style="font-size: 20px;">java</a> <a href="/tags/javassist/" style="font-size: 10px;">javassist</a> <a href="/tags/kafka/" style="font-size: 11.54px;">kafka</a> <a href="/tags/linux/" style="font-size: 12.31px;">linux</a> <a href="/tags/log/" style="font-size: 17.69px;">log</a> <a href="/tags/log4j/" style="font-size: 12.31px;">log4j</a> <a href="/tags/logback/" style="font-size: 13.08px;">logback</a> <a href="/tags/map/" style="font-size: 10px;">map</a> <a href="/tags/memecached/" style="font-size: 10.77px;">memecached</a> <a href="/tags/mina/" style="font-size: 13.08px;">mina</a> <a href="/tags/mongodb/" style="font-size: 19.23px;">mongodb</a> <a href="/tags/mq/" style="font-size: 13.85px;">mq</a> <a href="/tags/mqtt/" style="font-size: 10.77px;">mqtt</a> <a href="/tags/mybatis/" style="font-size: 16.15px;">mybatis</a> <a href="/tags/netty/" style="font-size: 10px;">netty</a> <a href="/tags/nginx/" style="font-size: 11.54px;">nginx</a> <a href="/tags/nio/" style="font-size: 13.08px;">nio</a> <a href="/tags/nodejs/" style="font-size: 10px;">nodejs</a> <a href="/tags/postgresql/" style="font-size: 10.77px;">postgresql</a> <a href="/tags/protobuf/" style="font-size: 10px;">protobuf</a> <a href="/tags/proxy/" style="font-size: 10px;">proxy</a> <a href="/tags/push/" style="font-size: 10px;">push</a> <a href="/tags/rabbitmq/" style="font-size: 11.54px;">rabbitmq</a> <a href="/tags/redis/" style="font-size: 13.85px;">redis</a> <a href="/tags/rpc/" style="font-size: 19.23px;">rpc</a> <a href="/tags/sitemesh/" style="font-size: 10px;">sitemesh</a> <a href="/tags/sld/" style="font-size: 10px;">sld</a> <a href="/tags/slf4j/" style="font-size: 10px;">slf4j</a> <a href="/tags/socket/" style="font-size: 14.62px;">socket</a> <a href="/tags/spatialite-for-android/" style="font-size: 10px;">spatialite for android</a> <a href="/tags/spi/" style="font-size: 10px;">spi</a> <a href="/tags/spring/" style="font-size: 18.46px;">spring</a> <a href="/tags/tomcat/" style="font-size: 10.77px;">tomcat</a> <a href="/tags/transaction/" style="font-size: 10px;">transaction</a> <a href="/tags/web/" style="font-size: 10px;">web</a> <a href="/tags/xSocket/" style="font-size: 14.62px;">xSocket</a> <a href="/tags/zbus/" style="font-size: 10px;">zbus</a> <a href="/tags/zookeeper/" style="font-size: 10.77px;">zookeeper</a> <a href="/tags/数据结构/" style="font-size: 10.77px;">数据结构</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/01/">January 2016</a><span class="archive-list-count">67</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/12/">December 2015</a><span class="archive-list-count">81</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/11/">November 2015</a><span class="archive-list-count">2</span></li></ul>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recents</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2016/01/30/资料/">(no title)</a>
          </li>
        
          <li>
            <a href="/2016/01/30/java/13.Classloader系列一/">ClassLoader系列一</a>
          </li>
        
          <li>
            <a href="/2016/01/29/hadoop/1.hadoop系列之源码编译/">hadoop系列一之源码编译</a>
          </li>
        
          <li>
            <a href="/2016/01/29/go/1.GO系列之入门/">Go系列一之入门</a>
          </li>
        
          <li>
            <a href="/2016/01/28/tomcat/2.tomcat性能优化/">tomcat性能优化</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2016 John Doe<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    


<script src="http://libs.baidu.com/jquery/2.0.3/jquery.min.js"></script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css" type="text/css">
  <script src="/fancybox/jquery.fancybox.pack.js" type="text/javascript"></script>


<script src="/js/script.js" type="text/javascript"></script>

  </div>
</body>
</html>